﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Rarous.TexyNet {

  /// <summary>
  /// Modifikátor.
  /// </summary>
  public class Modifier {
  
    #region Fields
    private string _toolTip;
    private readonly StringBuilder _cssClass;
    private readonly StringBuilder _style;
    #endregion

    #region Constructors
    /// <summary>
    /// Initializes a new instance of the Modifier class.
    /// </summary>
    public Modifier()
      : this(String.Empty) {
    }

    /// <summary>
    /// Initializes a new instance of the Modifier class.
    /// </summary>
    /// <param name="toolTip"></param>
    public Modifier(string toolTip)
      : this(toolTip, String.Empty) {
    }

    /// <summary>
    /// Initializes a new instance of the Modifier class.
    /// </summary>
    /// <param name="toolTip"></param>
    /// <param name="cssClass"></param>
    public Modifier(string toolTip, string cssClass) {
      _toolTip = toolTip;
      _cssClass = new StringBuilder(cssClass);
      _style = new StringBuilder();
    }
    #endregion

    #region Properties
    /// <summary>
    /// Vrací třídu odkazu.
    /// </summary>
    public string CssClass {
      get {
        return _cssClass.ToString().Trim();
      }
    }

    /// <summary>
    /// Vrací styl odkazu.
    /// </summary>
    public string Style {
      get {
        return _style.ToString().Trim();
      }
    }

    /// <summary>
    /// Vraci nebo nastavuje tooltip k odkazu (atribut title).
    /// </summary>
    public string ToolTip {
      get {
        return _toolTip;
      }
      set {
        _toolTip = value;
      }
    }

    /// <summary>
    /// Vrací příznak, zda-li má reference modifikátor.
    /// </summary>
    public bool IsNotEmpty {
      get {
        return !String.IsNullOrEmpty(_toolTip)
            || _cssClass.Length > 0
            || _style.Length > 0;
      }
    }
    #endregion

    #region Public Methods
    /// <summary>
    /// Přidá styl odkazu.
    /// </summary>
    /// <param name="style">CSS zápis stylu.</param>
    /// <returns>Vrací <c>this</c></returns>
    public Modifier AddStyle(string style) {
      _style.Append((_style.Length == 0 || _style[_style.Length - 1] == ';') ? "" : ";").Append(style);
      return this;
    }

    /// <summary>
    /// Přidá styl odkazu.
    /// </summary>
    /// <param name="key">Název vlastnosti.</param>
    /// <param name="value">Hodnota vlastnosti.</param>
    /// <returns>Vrací <c>this</c></returns>
    public Modifier AddStyle(string key, string value) {
      return AddStyle(String.Format("{0}:{1}", key, value));
    }

    /// <summary>
    /// Přidá CSS třídu odkazu.
    /// </summary>
    /// <param name="cssClass">Název třídy.</param>
    /// <returns>Vrací <c>this</c></returns>
    public Modifier AddCssClass(string cssClass) {
      _cssClass.Append(" ").Append(cssClass);
      return this;
    }
    #endregion

    #region Object Members
    /// <summary>
    /// Vrací textovou podobu modifikátoru.
    /// </summary>
    /// <returns></returns>
    public override string ToString() {
      StringBuilder sb = new StringBuilder();
      if (IsNotEmpty) {
        sb.Append(" .");
        if (!String.IsNullOrEmpty(ToolTip)) {
          sb.AppendFormat("({0})", ToolTip);
        }
        if (!String.IsNullOrEmpty(CssClass)) {
          sb.AppendFormat("[{0}]", CssClass);
        }
        if (!String.IsNullOrEmpty(Style)) {
          sb.AppendFormat("{{{0}}}", Style);
        }
      }
      return sb.ToString();
    }
    #endregion
  }
}
